/*
 * @Author: Tendo
 * @Date: 2022-04-28 15:05:39
 * @LastEditTime: 2022-04-28 16:02:27
 * @LastEditors: Tendo
 * @Description: 
 * @FilePath: \TS\常用类型.ts
 */

// 当你声明一个函数的时候，你可以在每个参数后面添加一个类型注解，声明函数可以接受什么类型的参数。参数类型注解跟在参数名字后面：
function greet(name: string) {
    console.log("Hello, " + name.toUpperCase() + "!!");
}

// greet(42);
// 类型“number”的参数不能赋给类型“string”的参数。


// 匿名函数有一点不同于函数声明，当 TypeScript 知道一个匿名函数将被怎样调用的时候，匿名函数的参数会被自动的指定类型。
const names = ["hanyi", "tendo", "jw"];

names.forEach(function (s) {
    console.log(s.toUpperCase());
});


// 除了原始类型，最常见的类型就是对象类型了。定义一个对象类型，我们只需要简单的列出它的属性和对应的类型。
function objectTypes(pt: { x: number; y: number }) {
    console.log("The x's value is " + pt.x);
    console.log("The y's value is " + pt.y);
}
objectTypes({ x: 3, y: 7 });

// 一个函数用来处理字符串或者数字：
function printId(id: number | string) {
    console.log("Your ID is: " + id);
}
// OK
printId(101);
// OK
printId("202");
// Error
// printId({ myID: 22342 });

// // Error
// function printId2(id: number | string) {
//     console.log(id.toUpperCase());
//     ////报错：类型“number”上不存在属性“toUpperCase”。
// }

function printId3(id: number | string) {
    if (typeof id === "string") {
        // In this branch, id is of type 'string'
        console.log(id.toUpperCase());
    } else {
        // Here, id is of type 'number'
        console.log(id);
    }
}

// 数字和字符串都有 slice 方法，你就可以直接使用这个属性
function getFirstThree(x: number[] | string) {
    return x.slice(0, 3);
}
